package Offer088;

/**
 * 爬楼梯的最小成本
 * 数组的每个下标作为一个阶梯，第 i 个阶梯对应着一个非负数的体力花费值cost[i]（下标从 0 开始）。
 *
 * 每当爬上一个阶梯都要花费对应的体力值，一旦支付了相应的体力值，就可以选择向上爬一个阶梯或者爬两个阶梯。
 *
 * 请找出达到楼层顶部的最低花费。在开始时，你可以选择从下标为 0 或 1 的元素作为初始阶梯。
 * @author 23737
 * @time 2021.11.16
 */
public class Test {
    public static void main(String[] args) {

    }
}

/**
 * 动态规划
 * dp[i] 的值是由 dp[i-1]和dp[i-2]的最小值再加上当前的cost[i]
 * dp[i]=Math.min(dp[i-1],dp[i-2])+cost[i];
 */
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int len = cost.length;
        int dp[] = new int[len];//走过阶梯i的体力，不是到达i的体力
        dp[0]=cost[0];
        dp[1]=cost[1];
        for(int i=2;i<len;i++){
            dp[i]=Math.min(dp[i-1],dp[i-2])+cost[i];
        }
        return Math.min(dp[len-1],dp[len-2]);
    }
}
